import os
import time
from datetime import datetime

#系统主函数入口
if __name__ == "__main__":
    workspace = ['xskj','znmzcpb','stqdyyb','wlwaqcpb','spwlwcpb','znwlwcpb','5gzwcpb',
                'znljcpb','cywlwcpb','kfptcpb','czxtcpb','itnenglibu','znyjcpb']
                #'system-workspace']#system-workspace为测试使用 

    #判断目录是否存在，如果不存在，则新建目录
    workpath = '/etc/kube-default-policy'
    if not os.path.exists(workpath):
        os.mkdir(workpath, 777)

    while True:
        #运行日志记录
        runtime_log = open(workpath+'/runtime_log.log','a')
        #获取当前时间
        time_now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

        #判断ns_result.txt是否存在，如果不存在ns_result.txt，则执行kubectl get ns，并输出至ns_result.txt
        if not os.path.exists(workpath+'/ns_result.txt'):
            #在linux中执行命令，popen方法只支持读取一次，所以必须使用中间函数将内容取出，然后关闭popen命令
            ns_result = os.popen('kubectl get ns','r')
            ns_result_read = ns_result.read()
            ns_result.close()
            #将命令返回输出至ns_result.txt中
            with open(workpath+'/ns_result.txt', 'w') as f:
                f.write(ns_result_read)
            #记录进日志中
            runtime_log.write(time_now+'\n')
            runtime_log.write('kubectl get ns 第一次执行，记录本次ns结果：\n')
            runtime_log.write(ns_result_read+'\n')

        #当ns_result.txt存在时，将最新执行kubectl get ns的结果与之对比
        else:
            #获取上一次的ns结果
            f1 = open(workpath+'/ns_result.txt', 'r').readlines()
            ns_name_last_list = []
            for f1_line in f1:
                if 'Active' in f1_line:
                    ns_name_last = f1_line.split()
                    ns_name_last_list.append(ns_name_last[0])
            #获取最新的ns结果
            result1 = os.popen('kubectl get ns','r')
            ns_name_now_list = []
            #popen只支持读取一次，必须把值先取出来
            result1_list = []
            for result1_line in result1.readlines():
                result1_list.append(result1_line)
                if 'Active' in result1_line:
                    #获取命名空间的名称
                    ns_name_now = result1_line.split()
                    ns_name_now_list.append(ns_name_now[0])
            result1.close()

            #对比两次的命名空间，检查是否存在新增或删除的命名空间
            #在最新的ns结果中但是没有在上一次的ns结果中，即新增命名空间
            ns_name_diff_list = set(ns_name_now_list).difference(set(ns_name_last_list))
            #在上一次的ns结果中但是没有在最新的ns结果中，即删除命名空间
            ns_name_del_list = set(ns_name_last_list).difference(set(ns_name_now_list))
            if ns_name_diff_list or ns_name_del_list:
                #将最新的ns结果存入ns_result
                with open(workpath+'/ns_result.txt', 'w') as f4:
                    f4.write(''.join(result1_list))
                #日志记录
                runtime_log.write(time_now+'\n')
                runtime_log.write('kubectl get ns 出现增减，记录本次ns结果：\n')
                runtime_log.write(''.join(result1_list)+'\n')
                
            
            if ns_name_diff_list:
                #遍历新增的命名空间
                for ns_name_diff in ns_name_diff_list:
                    #查看命名空间的标签
                    result2 = os.popen('kubectl get namespace '+ns_name_diff+' --show-labels','r')
                    for result2_line in result2.readlines():
                        if 'Active' in result2_line and 'workspace' in result2_line:
                            #获取命名空间的标签
                            ns_label = result2_line.split('/')[-1].replace('\n','').strip().replace('workspace=','')#去除回车，去除前后空格，去除workspace=
                            #如果这个命名空间属于设定的命名空间
                            if ns_label in workspace:
                                f2 = open('/kube-default-policy/default.yaml', 'r').read().split("$")
                                #替换第四行
                                f2[1]='default-'+ns_label+'-'+ns_name_diff
                                #替换第五行
                                f2[3]=ns_name_diff
                                #替换第14行
                                f2[5]=ns_label
                                #替换第26行
                                f2[7]=ns_label
                                #生成新文件
                                with open(workpath+'/default-'+ns_label+'-'+ns_name_diff+'.yaml', 'w') as f3:
                                    for f_line in f2:
                                        f3.write(f_line)
                                #运行该文件
                                os.popen('kubectl apply -f '+workpath+'/default-'+ns_label+'-'+ns_name_diff+'.yaml','r')
                                #记录日志
                                runtime_log.write('出现新增，执行命令：'+'kubectl apply -f '+workpath+'/default-'+ns_label+'-'+ns_name_diff+'.yaml\n')

                                #记录日志
                                runtime_log.write('出现新增，执行命令：'+'kubectl create rolebinding namespace-admin-binding --clusterrole=admin --user='+ns_label+' -n '+ns_name_diff+'\n')
                                #截断读行操作，遍历下一个新增的命名空间
                                break
                    result2.close()

            if ns_name_del_list:
                #查看workpath下的文件名
                file_name_list = []
                result3 = os.popen('ls '+workpath,'r')
                file_name_str_list = result3.read().split()
                result3.close()
                #当文件名包含yaml时将其存入file_name_list中
                for file_name_str in file_name_str_list:
                    if file_name_str.endswith('.yaml'):
                        file_name_list.append(file_name_str)
                #遍历删除的命名空间
                for ns_name_del in ns_name_del_list:
                    for file_name in file_name_list:
                        if ns_name_del in file_name:
                            os.popen('rm '+workpath+'/'+file_name,'r')
                            #记录日志
                            runtime_log.write('出现删减，执行命令：'+'rm '+workpath+'/'+file_name+'\n')
                            break
        #关闭运行日志
        runtime_log.close()
        #休眠5分钟
        time.sleep(300)
